/**
 * 文件上传中间件
 * @module middleware/upload
 */

const multer = require('multer');
const path = require('path');
const fs = require('fs');
require('dotenv').config();

// 获取上传路径
const uploadPath = process.env.UPLOAD_PATH || './src/uploads';
const maxFileSize = parseInt(process.env.MAX_FILE_SIZE) || 5 * 1024 * 1024; // 默认5MB

// 确保上传目录存在
if (!fs.existsSync(uploadPath)) {
  fs.mkdirSync(uploadPath, { recursive: true });
}

/**
 * 配置存储引擎
 * @type {multer.StorageEngine}
 */
const storage = multer.diskStorage({
  /**
   * 设置文件存储目录
   * @param {Object} req - 请求对象
   * @param {Object} file - 上传的文件
   * @param {Function} cb - 回调函数
   */
  destination: (req, file, cb) => {
    cb(null, uploadPath);
  },
  /**
   * 设置文件名
   * @param {Object} req - 请求对象
   * @param {Object} file - 上传的文件
   * @param {Function} cb - 回调函数
   */
  filename: (req, file, cb) => {
    // 生成唯一文件名: 时间戳-随机数-原始文件名
    const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9);
    const ext = path.extname(file.originalname);
    cb(null, uniqueSuffix + ext);
  }
});

/**
 * 文件过滤器
 * @param {Object} req - 请求对象
 * @param {Object} file - 上传的文件
 * @param {Function} cb - 回调函数
 */
const fileFilter = (req, file, cb) => {
  // 允许的文件类型
  const allowedTypes = /jpeg|jpg|png|gif|webp/;
  
  // 检查文件扩展名
  const extname = allowedTypes.test(path.extname(file.originalname).toLowerCase());
  
  // 检查MIME类型
  const mimetype = allowedTypes.test(file.mimetype);
  
  if (extname && mimetype) {
    return cb(null, true);
  } else {
    cb(new Error('只允许上传图片文件(jpeg, jpg, png, gif, webp)'));
  }
};

/**
 * 图片上传中间件
 * @type {multer.Multer}
 */
const uploadImage = multer({
  storage: storage,
  limits: { fileSize: maxFileSize },
  fileFilter: fileFilter
});

module.exports = {
  uploadImage
}; 